package top.wfzzq.dp.abstractFactory;

/**
 * 工厂管理（工厂方法设计模式）
 * 
 * @author wanghui
 *
 */
public class FactoryManger {
	public static Factory getFactory(String type) {
		if ("microsoft".equalsIgnoreCase(type)) {
			return new Mircrsoft();
		} else if ("sony".equalsIgnoreCase(type)) {
			return new Sony();
		}
		else if("Alibaba".equalsIgnoreCase(type)) {
			return new Alibaba();
		}
		else if("Tencent".equalsIgnoreCase(type)){
		    return new Tencent();
		}
		throw new RuntimeException("没有对应的厂商...");
	}

	/**
	 * 静态的反射工厂（反射工厂是工厂模式的特殊版本，充分的利用了java反射api达到更 灵活更安全的产生对象） 反射定义是程序在运行时可以自省状态和属性
	 * 第一个问题，怎么限定T只能是Factory的子类型 第二个问题，怎么创建指定Class的对象实例
	 */
	/**
	 * 泛型反射工厂，只需传入factory或者Factory子类的类型，创建对应的实力
	 * @param c类型
	 * @return 的实力
	 */
	public static <T extends Factory> T getFactory(Class<T> c) {
		try {
			// Class.newInstance()方法表示创建Class对应实例
			return c.newInstance();
		} catch (Exception ex) {
			return null;
		}
	}
}
